#ifndef SRC_LOG_HELPER
#define SRC_LOG_HELPER

#include <cassert>
#include <iostream>

#define INFO_PRINTF(fmt, ...)                                                  \
  do {                                                                         \
    fprintf(stdout, "[INFO] %s, %d: " fmt, __FILE__, __LINE__, ##__VA_ARGS__); \
    fflush(stdout);                                                            \
  } while (0)

#define COND_INFO_PRINTF(cond, fmt, ...)                                       \
  do {                                                                         \
    if (!cond) {                                                               \
      break;                                                                   \
    }                                                                          \
    fprintf(stdout, "[INFO] %s, %d: " fmt, __FILE__, __LINE__, ##__VA_ARGS__); \
    fflush(stdout);                                                            \
  } while (0)

#define DEBUG_PRINTF(fmt, ...)                                                 \
  do {                                                                         \
    fprintf(stderr, "[DEBUG] %s, %d: " fmt, __FILE__, __LINE__,                \
            ##__VA_ARGS__);                                                    \
    fflush(stderr);                                                            \
  } while (0)

#define WARNING_PRINTF(fmt, ...)                                               \
  do {                                                                         \
    fprintf(stderr, "[WARNING] %s, %d: " fmt, __FILE__, __LINE__,              \
            ##__VA_ARGS__);                                                    \
    fflush(stderr);                                                            \
  } while (0)

#define ERROR_PRINTF(fmt, ...)                                                 \
  do {                                                                         \
    fprintf(stderr, "[ERROR] %s, %d: " fmt, __FILE__, __LINE__,                \
            ##__VA_ARGS__);                                                    \
    fflush(stderr);                                                            \
    exit(1);                                                                   \
  } while (0)

#define ASSERT_PRINTF(expr, fmt, ...)                                          \
  do {                                                                         \
    if (!(expr)) {                                                             \
      fprintf(stderr, "[FATAL] %s, %d: " fmt, __FILE__, __LINE__,              \
              ##__VA_ARGS__);                                                  \
      fflush(stderr);                                                          \
      assert(expr);                                                            \
    }                                                                          \
  } while (0)

#endif /* SRC_LOG_HELPER */
